package day3.jdbc.spring;

import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import day1.domain.User;
import utility.DBCPUtils;

public class NamedJdbcTemplate {
	static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
			DBCPUtils.getInstance());

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User();
		user.setMoney(10);
		user.setId(4);
		addUser(user);
		System.out.println(findUser1(user));
		System.out.println(findUser(user));
	}

	static void addUser(User user) {
		String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		KeyHolder keyHolder = new GeneratedKeyHolder();
		named.update(sql, ps, keyHolder);
		int id = keyHolder.getKey().intValue();
		user.setId(id);
		@SuppressWarnings("rawtypes")
		Map map = keyHolder.getKeys();
		System.out.println("id map = "+ map);
	}

	static User findUser(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where  id = :id";
		Map<String, Number> params = new HashMap<String, Number>();
		// params.put("n", user.getName());
		params.put("m", user.getMoney());
		params.put("id", user.getId());
		User u = named.queryForObject(sql, params, new BeanPropertyRowMapper<User>(
				User.class));
		return  u;
	}

	static User findUser1(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where id= :id";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		User u = named.queryForObject(sql, ps, new BeanPropertyRowMapper<User>(
				User.class));
		return  u;
	}

}